package com.face.base.utils;

import com.baidu.aip.face.AipFace;
import org.json.JSONArray;
import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.util.HashMap;

/**
 * 百度云 AI。
 */
@Component
//@ConfigurationProperties(prefix = "baidu.ai")
public class BaiduAiUtil {

    @Value("${baidu.ai.appId}")
    private String APP_ID;
    @Value("${baidu.ai.apiKey}")
    private String API_KEY;
    @Value("${baidu.ai.secretKey}")
    private String SECRET_KEY;
    @Value("${baidu.ai.imageType}")
    private String IMAGE_TYPE;
    @Value("${baidu.ai.groupId}")
    private String groupId;

    private AipFace client;

    private final HashMap<String, String> options = new HashMap<>();

    /**
     * 人脸描述信息。
     */
    public static String faceMsg = "录入失败";
    /**
     * 人脸唯一值
     */
    public static String faceToken;

    public BaiduAiUtil() {
        options.put("quality_control", "NORMAL");
        options.put("liveness_control", "LOW");
    }

    @PostConstruct
    public void init() {
        client = new AipFace(APP_ID, API_KEY, SECRET_KEY);
    }

    /**
     * 判断用户是否已经注册了面部信息。
     */
    public Boolean faceExist(String userId) {
        // 返回 error_code。0：存在。非0：不存在。
        JSONObject result = client.getUser(userId, groupId, null);
        System.out.println("结果：【faceExist】" + result);
//        System.out.println("错误信息："+result.getString("error_msg"));
        faceMsg = result.getString("error_msg");
        int error_code = result.getInt("error_code");
        return error_code == 0;
    }

    /**
     * 人脸注册：将用户照片存入人脸库中。
     */
    public Boolean faceRegister(String userId, String image) {
        // 人脸注册
        JSONObject result = client.addUser(image, IMAGE_TYPE, groupId, userId, options);
        System.out.println("结果：【faceRegister】" + result);
//        faceToken = result.getString("face_token");
        faceMsg = result.getString("error_msg");
        int error_code = result.getInt("error_code");
//        System.out.println("error_code = " + error_code);
        return error_code == 0;
    }

    /**
     * 人脸更新：更新人脸库中的用户照片。
     */
    public Boolean faceUpdate(String userId, String image) {
        // 人脸更新
        JSONObject result = client.updateUser(image, IMAGE_TYPE, groupId, userId, options);
        int error_code = result.getInt("error_code");
        return error_code == 0;
    }

    /**
     * 人脸检测：判断上传图片中是否具有面部信息。
     */
    public Boolean faceCheck(String image) {
//        System.out.println("========================= faceCheck ==========================");

        JSONObject result = client.detect(image, IMAGE_TYPE, options);

        /**
         *
         * "error_code": 222203。无法解析人脸。检查图片质量。
         * 若发生 222203：请检测是否是图片格式不对。
         *      V3直接支持 BASE64 图片格式，不用编码。只需要去掉data url前缀即可。
         *      前缀 22 字符长。【str.substring(22)】
         */
        System.out.println("人脸信息：" + result.toString(2));
        // 确定是否包含 error_code ，以及 error_code == 0。
        if (result.has("error_code") && result.getInt("error_code") == 0) {
            JSONObject resultObject = result.getJSONObject("result");
            int face_num = resultObject.getInt("face_num"); // 检测的人脸数量。
            System.out.println("人脸面部个数：" + face_num);
//            System.out.println("===================== faceCheck ==============================");
            return face_num == 1;
        } else {
            return false;
        }
    }

    /**
     * 人脸查找：查找人脸库中最相似的人脸并返回数据
     * 处理：人脸的匹配得分（score）大于80分，即可认为是同一个用户。
     */
    public String faceSearch(String image) {
        JSONObject result = client.search(image, IMAGE_TYPE, groupId, options);
        faceMsg = result.getString("error_msg");
        // 查看结果。
        System.out.println("result: ===> \n" + result);
        if (result.has("error_code") && result.getInt("error_code") == 0) {
            JSONObject resultObject = result.getJSONObject("result");
            JSONArray userlist = resultObject.getJSONArray("user_list");
            if (userlist.length() > 0) {
                JSONObject user = userlist.getJSONObject(0);
                double score = user.getDouble("score");
                if (score > 80) {
                    return user.getString("user_id");
                }
            }
        }
        return null;
    }

    public void test(){
        System.out.println("注入成功...........");
    }
}
